今天開始要來介紹物件導向啦~~~~ 今天主要會介紹類別(Class)以及建構子(Construct)的概念,物件導向程式設計又稱OOP,從字面上來看就是以物件為目標寫程式,為什麼要學習物件導向?這裡我也不多贅述,優點見仁見智,有些人認為用物件導向概念寫出來的程式,方便學習、好維護......等,有些人不這麼認為,真的用過了就知道有哪些優點。
那麼什麼是物件呢?在python的世界任何都可以物件。物件(Object)可以把他想成是一個概念,在不同方面提到的object,也有不同的解釋,一般來說我們指的物件是類別的實例(Instance)。
底下我設計一個類別的架構,基於類別(Class)實例化之後的物件(object),他有屬性(Attributes)和方法(Methods),一個人就好像一個物件,這個人的身高、體重、年齡就像是屬性,這個人的能做的事情就像是方法。
以底下這段程式碼為例:
class Person(object):
def __init__(self, name, height, weight, age):
self.name = name
self.height = height
self.weight = weight
self.age = age
def introduce_myself(self):
print("Hi, I am {name} {height}cm {weight}kg {age} years old".format(name=self.name, height=self.height, weight=self.weight, age=self.age))
if __name__ == '__main__':
Jacky = Person("Jacky", 180, 70, 18)
Sandy = Person("Sandy", 160, 50, 18)
Jacky.introduce_myself() #Hi, I am Jacky 180cm 70kg 18 years old
Sandy.introduce_myself() #Hi, I am Sandy 160cm 50kg 18 years old
我設計一個類別,他會有名字、身高體重以及年齡,在14、15行透過呼叫Person這個類別,基於Person做實例化,建立兩個物件叫做Jacky、Sandy,並且輸入了名字、身高體重以及年齡作為參數,然後呼叫類別建立物件的時候,一定會先經過__init__(建構子),我輸入的這些參數,在建構子裡面就能夠定義屬於物件自己的屬性,Jacky的屬性就是屬於這個物件的並不會與Sandy共用。
從上文聽起來感覺建構子必須且重要,那什麼時候會用到建構子(?!) 我自己的經驗是在遇到輸入的資料需要共享給多個函數使用的時候,這個物件的屬性,物件隨時都能夠使用,不需要透過函數一直傳下去,因為遇到這種情況,所以我覺得建構子很重要,這是什麼意思呢?
讓我們來看看下面這段程式碼:
class Person(object):
def __init__(self, name, height, weight, age):
self.name = name
self.height = height
self.weight = weight
self.age = age
def introduce_myself(self):
print("Hi, I am {name} {height}cm {weight}kg {age} years old".format(name=self.name, height=self.height, weight=self.weight, age=self.age)) #Hi, I am Jacky 180cm 70kg 18 years old
self.ten_years_later()
def ten_years_later(self):
height = self.height + 10
weight = self.weight + 5
age = self.age + 10
print("Ten years, height {height}cm weight {weight}kg age {age}years old".format(height=height, weight=weight, age=age)) #Ten years, height 190cm weight 75kg age 28years old
def introduce_myself_func(name, height, weight, age):
print("Hi, I am {name} {height}cm {weight}kg {age} years old".format(name=name, height=height, weight=weight, age=age))
Person.ten_years_later_func(name, height, weight, age)
def ten_years_later_func(name, height, weight, age):
height = height + 10
weight = weight + 5
age = age + 10
print("Ten years, height {height}cm weight {weight}kg age {age}years old".format(name=name, height=height, weight=weight, age=age))
if __name__ == '__main__':
Jacky = Person("Jacky", 180, 70, 18)
Jacky.introduce_myself()
Person.introduce_myself_func("Jacky", 180, 70, 18)
這兩段的結果是一樣的,除了架構上不同,對我來說更深刻的差別是,13-17行是有透過建構子建立物件屬性,所以就可以在裡面直接透過物件取得物件屬性,想用隨時都可以用;23-27行是沒有透過建構子建立物件屬性,所以要取得參數只能透過呼叫時輸入參數,當有多個函數都需要用到屬性的時候,你呼叫函式的時候,就需要一直輸入相同的參數,相當的麻煩,架構上也不對。
今天分享的東西雖然不多,但是卻十分地重要,明天我要來分享方法(Metohd)。